// 导入数据库模块
const db = require('../db/index')

// 导入加密bcryptjs这个包
const bcrypt = require("bcryptjs")

// 导入jsonwebtoken包
const jwt = require("jsonwebtoken")

// 导入秘钥
const config = require("../config")

// 注册新用户的处理函数
exports.regUser = (req, res) => {
        // 获取客户端提交到服务器的用户信息
        const userinfo = req.body
        var student = { sqlClassid: '', sqlMajorid: '' }
            // console.log(userinfo);

        // 对表单中的数据进行合法性校验
        // 使用if else 对合法性验证 性能低下 一般提倡使用 第三方验证模块
        // if (!userinfo.username || !userinfo.password) {
        //     // return res.send({
        //     //     status: 1,
        //     //     msg: '用户名或密码不合法！'
        //     // })
        //     return res.cc('用户名或密码不合法！')
        // }
        // res.send('注册')

        // 定义sql语句
        const sqlStr = 'select * from studentmsg where student_id=?'
            // 获取用户班级id
        const sql3 = 'select id from class_name where class_name=?;'
        db.query(sql3, userinfo.class_name, (err, results) => {
            if (err) return res.cc(err)
            if (results.length === 0) return res.cc('没有该班级')
            return student.sqlClassid = results[0].id
        })

        // 获取用户专业id
        const sql4 = 'select id from major where major_name=?;'
        db.query(sql4, userinfo.major_name, (err, results) => {
            if (err) return res.cc(err)
                // if (results.length === 0) return res.cc('没有该专业')
            return student.sqlMajorid = results[0].id
        })


        db.query(sqlStr, [userinfo.student_id], (err, results) => {
            if (err) {
                // return res.send({status: 1,msg: err.message})
                // 调用封装函数 res.cc
                return res.cc(err)
            }
            if (results.length > 0) {
                // return res.send({
                //     status: 1,
                //     msg: '用户名已存在'
                // })
                return res.cc('用户名已存在')
            }
            // 调用 bcrypt.hashSync()对密码进行加密
            // userinfo.password = bcrypt.hashSync(userinfo.password, 10)




            // 定义插入新用户的sql 语句
            const sql = 'insert into studentmsg set ?'

            // if (userinfo.class_name === '软件1班') {
            //     class_id = 1
            // } else if (userinfo.class_name === '软件1班') {

            // }

            db.query(sql, { name: userinfo.username, student_pwd: userinfo.password, age: userinfo.age, sex: userinfo.sex, student_id: userinfo.student_id, email: userinfo.email, class_id: student.sqlClassid, class: userinfo.class_name, major_id: student.sqlMajorid }, (err, results) => {
                // 判断sql语句是否执行成功
                // if (err) return res.send({
                //         status: 1,
                //         msg: err.message
                //     })
                if (err) return res.cc(err)

                // 判断影响行数是否为1
                if (results.affectedRows !== 1)
                // return res.send({
                //         status: 1,
                //         msg: '注册用户失败'
                //     })
                    return res.cc('插入student失败')
                    // const sql3 = 'insert into class_name set ?'
                    // db.query(sql3,{class_name:userinfo.class_name},(err,results)=>{
                    //     if (err) return res.cc(err)
                    //     if(results.affectedRows !== 1)  return res.cc('插入')
                    // })
                res.cc('注册成功', 200)
            })
        })

    }
    // 辅导员注册
exports.instructorReguser = (req, res) => {
    // 获取客户端提交到服务器的用户信息
    const userinfo = req.body
        // console.log(userinfo);

    // 定义sql语句
    const sqlStr = 'select * from instructor where username=?'

    db.query(sqlStr, [userinfo.username], (err, results) => {
        if (err) {
            // return res.send({status: 1,msg: err.message})
            // 调用封装函数 res.cc
            return res.cc(err)
        }
        if (results.length > 0) {
            return res.cc('用户名已存在')
        }

        // 定义插入新用户的sql 语句
        const sql = 'insert into instructor set ?'
        db.query(sql, { username: userinfo.username, password: userinfo.password }, (err, results) => {
            if (err) return res.cc(err)

            // 判断影响行数是否为1
            if (results.affectedRows !== 1)
                return res.cc('注册用户失败')

            res.cc('注册成功', 200)
        })
    })
}




// 辅导员登录
exports.instructorLogin = (req, res) => {
    // 接受表单数据
    const userinfo = req.body
        // 定义数据库语句
    const sql2 = 'select * from instructor where username=? '
        // 执行sql语句
    db.query(sql2, [userinfo.username], (err, results) => {
        // 执行sql语句失败
        if (err) return res.cc(err)
            // 执行sql语句成功 但是如果获取的数据库条数不等于1 
            // results.affectedRows表示受影响的行数而results.length表示数据库数据的长度
        if (results.length !== 1) return res.cc('用户名不存在！')

        // 判断登录密码是否正确 核心思路bcrypt.compareSync(用户的密码，数据库的密码)
        // 用户输入的密码和数据库的密码进行对比
        // const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
        // if (!compareResult) return res.cc('登录失败，密码输入错误')
        if (userinfo.password !== results[0].password) return res.cc('登录失败，密码输入错误')


        const user = {...results[0], password: '', user_pic: '' }
            // console.log(user);
            //    jwt.sign( )生成jwt字符串 需要三个参数：用户信息对象，加密密钥，配置对象

        const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
            // console.log(tokenStr);
            // 调用res.send() 将token 响应给客户端
            // res.send({
            //         status: 0,
            //         msg: '登录成功',
            //         token: 'Bearer ' + tokenStr
            //     })

        const data = {
            status: 0,
            message: '登录成功',
            token: 'Bearer ' + tokenStr,
        }
        res.send(JSON.stringify(data));

    })

}


// 学生登录的处理函数
exports.studentLogin = (req, res) => {
    // 接受表单数据
    const userinfo = req.body
        // 定义数据库语句
    const sql2 = 'select * from studentmsg where name=? '
        // 执行sql语句
    db.query(sql2, [userinfo.username], (err, results) => {
        // 执行sql语句失败
        if (err) return res.cc(err)
            // 执行sql语句成功 但是如果获取的数据库条数不等于1 
            // results.affectedRows表示受影响的行数而results.length表示数据库数据的长度
        if (results.length !== 1) return res.cc('用户名不存在！')

        // 判断登录密码是否正确 核心思路bcrypt.compareSync(用户的密码，数据库的密码)
        // 用户输入的密码和数据库的密码进行对比
        // const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
        // if (!compareResult) return res.cc('登录失败，密码输入错误')
        // 不再进行加密对比
        if (userinfo.password !== results[0].student_pwd) return res.cc('登录失败，密码输入错误')
        const user = {...results[0], student_pwd: '' }
            // console.log(user);
            //    jwt.sign( )生成jwt字符串 需要三个参数：用户信息对象，加密密钥，配置对象
        const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
            // console.log(tokenStr);
            // 调用res.send() 将token 响应给客户端
            // res.send({
            //         status: 0,
            //         msg: '登录成功',
            //         token: 'Bearer ' + tokenStr
            //     })
        const data = {
            status: 0,
            id: user.id,
            message: '登录成功',
            token: 'Bearer ' + tokenStr,
        }
        res.send(JSON.stringify(data));

    })

}


// 教师登录方法 可以展示学生信息
exports.teacherLogin = (req, res) => {
    // 接受表单数据
    const userinfo = req.body
        // 定义数据库语句
    const sql2 = 'select * from ev_users where username=? '
        // 执行sql语句
    db.query(sql2, [userinfo.username], (err, results) => {
        // 执行sql语句失败
        if (err) return res.cc(err)
            // 执行sql语句成功 但是如果获取的数据库条数不等于1 
            // results.affectedRows表示受影响的行数而results.length表示数据库数据的长度
        if (results.length !== 1) return res.cc('用户名不存在！')

        // 判断登录密码是否正确 核心思路bcrypt.compareSync(用户的密码，数据库的密码)
        // 用户输入的密码和数据库的密码进行对比
        if (userinfo.password !== results[0].password) return res.cc('登录失败，密码输入错误')


        const user = {...results[0], password: '', user_pic: '' }
            // console.log(user);
            //    jwt.sign( )生成jwt字符串 需要三个参数：用户信息对象，加密密钥，配置对象

        const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
            // console.log(tokenStr);
            // 调用res.send() 将token 响应给客户端
            // res.send({
            //         status: 0,
            //         msg: '登录成功',
            //         token: 'Bearer ' + tokenStr
            //     })
        if (results[0].id > 10) {
            return res.cc('用户不是教师')
        }
        const data = {
            status: 0,
            message: '登录成功',
            token: 'Bearer ' + tokenStr,
        }
        res.send(JSON.stringify(data));

    })

}


// 剔除完毕之后，user中只保留了用户的id username nickname email 这四个属性值
// 不在包含密码和头像
// const user = {...results[0], password: '', user_pic: '' }